home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Games / NetHack 3.1.3 / source / src / exper.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-01  |  4.8 KB  |  206 lines  |  [TEXT/R*ch]

  1. /*    SCCS Id: @(#)exper.c    3.1    90/22/02
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. #ifdef LINT
  8. #define    NEW_SCORING
  9. #endif
  10. long
  11. newuexp(lev)
  12. register unsigned lev;
  13. {
  14. #ifdef LINT    /* long conversion */
  15.     return(0L * lev);
  16. #else
  17.     if(lev < 10) return (10L*(1L << lev));
  18.     if(lev < 20) return (10000L*(1L << (lev-10)));
  19.     return((long)(10000000L*(lev-19)));
  20. #endif
  21. }
  22.  
  23. int
  24. experience(mtmp, nk)    /* return # of exp points for mtmp after nk killed */
  25.     register struct    monst *mtmp;
  26.     register int    nk;
  27. #if defined(applec)
  28. # pragma unused(nk)
  29. #endif
  30. {
  31.     register struct permonst *ptr = mtmp->data;
  32.     int    i, tmp, tmp2;
  33.  
  34.     tmp = 1 + mtmp->m_lev * mtmp->m_lev;
  35.  
  36. /*    For higher ac values, give extra experience */
  37.     if((i = find_mac(mtmp)) < 3) tmp += (7 - i) * (i < 0) ? 2 : 1;
  38.  
  39. /*    For very fast monsters, give extra experience */
  40.     if(ptr->mmove >= 12) tmp += (ptr->mmove >= 18) ? 5 : 3;
  41.  
  42. /*    For each "special" attack type give extra experience */
  43.     for(i = 0; i < NATTK; i++) {
  44.  
  45.         tmp2 = ptr->mattk[i].aatyp;
  46.         if(tmp2 > AT_BUTT) {
  47.  
  48.         if(tmp2 == AT_WEAP) tmp += 5;
  49.         else if(tmp2 == AT_MAGC) tmp += 10;
  50.         else tmp += 3;
  51.         }
  52.     }
  53.  
  54. /*    For each "special" damage type give extra experience */
  55.     for(i = 0; i < NATTK; i++) {
  56.  
  57.         tmp2 = ptr->mattk[i].adtyp;
  58.         if(tmp2 > AD_PHYS && tmp2 < AD_BLND) tmp += 2*mtmp->m_lev;
  59.         else if((tmp2 == AD_DRLI) || (tmp2 == AD_STON)) tmp += 50;
  60.         else if(tmp != AD_PHYS) tmp += mtmp->m_lev;
  61.         /* extra heavy damage bonus */
  62.         if((int)(ptr->mattk[i].damd * ptr->mattk[i].damn) > 23)
  63.         tmp += mtmp->m_lev;
  64.     }
  65.  
  66. /*    For certain "extra nasty" monsters, give even more */
  67.     if(extra_nasty(ptr)) tmp += (7*mtmp->m_lev);
  68.     if(ptr->mlet == S_EEL) tmp += 1000;
  69.  
  70. /*    For higher level monsters, an additional bonus is given */
  71.     if(mtmp->m_lev > 8) tmp += 50;
  72.  
  73. #ifdef NEW_SCORING
  74.     /* ------- recent addition: make nr of points decrease
  75.            when this is not the first of this kind */
  76.     { unsigned ul = u.ulevel;
  77.       int ml = mtmp->m_lev;
  78.     /* points are given based on present and future level */
  79.       if(ul < MAXULEV)
  80.         for(tmp2 = 0; !tmp2 || ul + tmp2 <= ml; tmp2++)
  81.         if(u.uexp + 1 + (tmp + ((tmp2 <= 0) ? 0 : 4<<(tmp2-1)))/nk
  82.             >= newuexp(ul) )
  83.             if(++ul == MAXULEV) break;
  84.  
  85.       tmp2 = ml - ul -1;
  86.       tmp = (tmp + ((tmp2 < 0) ? 0 : 4<<tmp2))/nk;
  87.       if(tmp <= 0) tmp = 1;
  88.     }
  89.     /* note: ul is not necessarily the future value of u.ulevel */
  90.     /* ------- end of recent valuation change ------- */
  91. #endif /* NEW_SCORING /**/
  92.  
  93. #ifdef MAIL
  94.     /* Mail daemons put up no fight. */
  95.     if(mtmp->data == &mons[PM_MAIL_DAEMON]) tmp = 1;
  96. #endif
  97.  
  98.     return(tmp);
  99. }
  100.  
  101. void
  102. more_experienced(exp, rexp)
  103.     register int exp, rexp;
  104. {
  105.     u.uexp += exp;
  106.     u.urexp += 4*exp + rexp;
  107.     if(exp
  108. #ifdef SCORE_ON_BOTL
  109.        || flags.showscore
  110. #endif
  111.        ) flags.botl = 1;
  112.     if(u.urexp >= ((pl_character[0] == 'W') ? 1000 : 2000))
  113.         flags.beginner = 0;
  114. }
  115.  
  116. void
  117. losexp() {    /* hit by drain life attack */
  118.  
  119.     register int num;
  120.  
  121. #ifdef POLYSELF
  122.     if(resists_drli(uasmon)) return;
  123. #endif
  124.  
  125.     if(u.ulevel > 1) {
  126.         pline("Goodbye level %u.", u.ulevel--);
  127.         /* remove intrinsic abilities */
  128.         adjabil((int)u.ulevel+1, (int)u.ulevel);
  129.     } else
  130.         u.uhp = -1;
  131.     num = newhp();
  132.     u.uhp -= num;
  133.     u.uhpmax -= num;
  134.     num = rn1((int)u.ulevel/2+1, 2);        /* M. Stephenson */
  135.     u.uen -= num;
  136.     if (u.uen < 0)        u.uen = 0;
  137.     u.uenmax -= num;
  138.     if (u.uenmax < 0)    u.uenmax = 0;
  139.     u.uexp = newuexp(u.ulevel) - 1;
  140.     flags.botl = 1;
  141. }
  142.  
  143. /*
  144.  * Make experience gaining similar to AD&D(tm), whereby you can at most go
  145.  * up by one level at a time, extra expr possibly helping you along.
  146.  * After all, how much real experience does one get shooting a wand of death
  147.  * at a dragon created with a wand of polymorph??
  148.  */
  149. void
  150. newexplevel() {
  151.  
  152.     register int tmp;
  153.  
  154.     if(u.ulevel < MAXULEV && u.uexp >= newuexp(u.ulevel)) {
  155.  
  156.         u.ulevel++;
  157.         if (u.uexp >= newuexp(u.ulevel)) u.uexp = newuexp(u.ulevel) - 1;
  158.         pline("Welcome to experience level %u.", u.ulevel);
  159.         set_uasmon();    /* set up for the new level. */
  160.         /* give new intrinsics */
  161.         adjabil((int)u.ulevel-1, (int)u.ulevel);
  162.         tmp = newhp();
  163.         u.uhpmax += tmp;
  164.         u.uhp += tmp;
  165.         tmp = rn1((int)ACURR(A_WIS)/2+1, 2); /* M. Stephenson */
  166.         u.uenmax += tmp;
  167.         u.uen += tmp;
  168.         flags.botl = 1;
  169.     }
  170. }
  171.  
  172. void
  173. pluslvl() {
  174.     register int num;
  175.  
  176.     You("feel more experienced.");
  177.     num = newhp();
  178.     u.uhpmax += num;
  179.     u.uhp += num;
  180.     num = rn1((int)ACURR(A_WIS)/2+1, 2);    /* M. Stephenson */
  181.     u.uenmax += num;
  182.     u.uen += num;
  183.     if(u.ulevel < MAXULEV) {
  184.         u.uexp = newuexp(u.ulevel);
  185.         pline("Welcome to experience level %u.", ++u.ulevel);
  186.         adjabil((int)u.ulevel-1, (int)u.ulevel);
  187.     }
  188.     flags.botl = 1;
  189. }
  190.  
  191. long
  192. rndexp()
  193. {
  194.     register long minexp,maxexp;
  195.  
  196.     if(u.ulevel == 1)
  197.         return rn2((int)newuexp(1));
  198.     else {
  199.         minexp = newuexp(u.ulevel - 1);
  200.         maxexp = newuexp(u.ulevel);
  201.         return(minexp + rn2((int)(maxexp - minexp)));
  202.     }
  203. }
  204.  
  205. /*exper.c*/
  206.